import axios from 'axios'
import store from '@/store'
import JSONBig from 'json-bigint'
import router from '@/router'
// 用create创建一个新的axios实例
const request = axios.create({
  baseURL: 'http://toutiao.itheima.net/',
  transformResponse: [function (data) {
    // 对响应数据ID大于有效范围的情况进行处理 将它转化为一个对象类型的数据
    try {
      return JSONBig.parse(data)
    } catch (err) {
      return data
    }
  }]
})
// 配置请求拦截器
request.interceptors.request.use(config => {
  // config ：本次请求的配置对象
  // config 里面有一个属性：headers
  const { user } = store.state
  if (user && user.token) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
}, error => {
  // 如果发生了错误就返回一个错误对象
  return Promise.reject(error)
})
// 配置token再刷新
request.interceptors.response.use((data) => {
  // 正常情况 token正常情况下会获取到数据（直接返回出去） 当token失效不会进入这个函数
  return data
}, async (err) => {
  const user = store.state.user
  // 如果时401，判断有没有refresh_token 如果没有就跳到重新登陆页面
  if (err.response && err.response.status === 401) {
    if (!user && !user.refresh_token) {
      router.push('/login')
      return
    }
  }
  // 如果有refresh_token,则发起请求，重新请求token
  try {
    const { data } = await axios({
      url: 'http://toutiao.itheima.net/v1_0/authorizations',
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${user.refresh_token}`
      }
    })
    // 将新的token存入本地
    store.commit('setUser', {
      refresh_token: user.refresh_token,
      token: data.data.token
    })
    // 重新发送请求
    // return 把 request 的请求结果继续返回给发请求的具体位置
    return request(err.config)
  } catch (err) {
    // 错误 抛出错误对象
    return Promise.reject(err)
  }
})

export default request
